package JDBC;

import java.util.Objects;
import java.util.concurrent.*;

public class DYA07 {
    public static void main(String[] args) {
//        ExecutorService service =Executors.newFixedThreadPool(5);
//        for (int i = 0; i < 10; i++) {
//            service.execute(()->{
//                System.out.println("task"+Thread.currentThread().getName());
//            });
//        }
//
//        service.shutdown();

LinkedBlockingQueue<Runnable> workQueue=new LinkedBlockingQueue<>(1000);
ThreadPoolExecutor service=new ThreadPoolExecutor(
        3,
        5,
        60,
        TimeUnit.SECONDS,
        workQueue,

        Executors.defaultThreadFactory(),
        new ThreadPoolExecutor.CallerRunsPolicy()
        );
        //用于放置待执行的任务，待执行任务的数量最大设置为1000，当核心线程满时，临时线程也满时，任务进入队列排队，排队上限设置为1000
        //<Runnable>限制了只能存放Runnable任务（也可以是Callable）
//        LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(1000);
//        //创建自定义线程池（ThreadPoolExecutor），设置核心线程数量为3，一般不会被回收
//        //最大线程数量设置5，除了设置的3个核心线程外，其他线程会有空闲存货时间，设置的60秒，TimeUnit.SECONDS指定时间单位就是用来指定时间单位。
//        ThreadPoolExecutor service = new ThreadPoolExecutor(
//                3,
//                5,
//                60,
//                TimeUnit.SECONDS,
//
//                //当核心线程满时，临时线程也满时，程序会到workQueue这里，任务会进入队列排队，上面解释了，设置排队数量上限为1000
//                //如果当排队达到上限时，就会进入new ThreadPoolExecutor.CallerRunsPolicy()的拒绝策略。
//                workQueue,
//
//                // 2.5 线程工厂
//                //     - 使用默认工厂创建线程
//                //     - 可自定义线程名称、优先级等（例如加业务前缀便于日志追踪）
//                //此处说的可自定义线程，具体怎么操作的，介绍一下。
//                Executors.defaultThreadFactory(),
//
//                // 2.6 拒绝策略
//                //     - 当队列满且线程数达到最大值时，如何处理新任务
//                //     - CallerRunsPolicy：由提交任务的线程直接执行该任务（同步阻塞）
//                //       替代方案：
//                //       - AbortPolicy（默认）：抛出RejectedExecutionException
//                //       - DiscardPolicy：静默丢弃任务
//                //       - DiscardOldestPolicy：丢弃队列中最旧的任务
//                new ThreadPoolExecutor.CallerRunsPolicy()
//        );




        // 3. 创建10个任务并提交给线程池
        for (int i = 1; i <= 10; i++) {
            final int taskId = i;
            service.execute(() -> {
                try {
                    // 模拟任务执行耗时
                    Thread.sleep(500);
                    System.out.println(Thread.currentThread().getName()
                            + " 执行任务-" + taskId);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        // 4. 关闭线程池（非阻塞）
        service.shutdown();

        // 5. 等待所有任务完成（可选）
        try {
            service.awaitTermination(1, TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }








    }
}
